//
//  CZUserAccount.swift
//  SinaSwift
//
//  Created by I Do Believe on 15/11/26.
//  Copyright © 2015年 apple11. All rights reserved.
//

import UIKit
/*

返回值字段	字段类型	字段说明
access_token	string	用于调用access_token，接口获取授权后的access token。
expires_in	string	access_token的生命周期，单位是秒数。

uid	string	当前授权用户的UID。
        , CustomStringConvertible 用来打印
*/
//将对象归档到沙盒中
class CZUserAccount: NSObject , NSCoding {
///用于调用access_token，接口获取授权后的access token
    var access_token: String?
///access_token的生命周期，单位是秒数  在KVC字典转模型 Int 等基本数据类型要设置初始值
    var expires_in : NSTimeInterval = 0 {
        didSet{
            //设置过期时间
            expiresDate = NSDate(timeIntervalSinceNow: expires_in)
        }
    }
    
    ///保存过期时间NSDate
    var expiresDate:NSDate?
    
 ///当前授权用户的UID
    var uid: String?
    
///字典转模型

    init(dict: [String: AnyObject] ) {
        super.init( )
        //KVC 字典转模型
        setValuesForKeysWithDictionary(dict)
      
    }

    //保存路径  类方法也可以访问，对象访问需要加上类名.属性名称
  static  let plistPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! + "/account.plist"
    ///保存账户信息到沙盒
    func savaAccount( ) {
        //归档 当前类
        NSKeyedArchiver.archiveRootObject(self, toFile: CZUserAccount.plistPath)
        
    }
    
    /*
    项目中经常需要使用到CZUserAccount,如果每次调用loadUserAccount,都会去沙盒解档一个账户.这样是比较消耗性能.
    当没有账户,去沙盒解档一个.如果解档账户成功,将它保存在内存中,以后直接访问内存中的账户.可以提高性能
    */
    
    //内存中的账户
    private static var userAccount: CZUserAccount?
    
    ///读取 沙盒中的对象 账户信息
    class func loadUserAccount( ) -> CZUserAccount? {
        //1.判断内存中的账户是否可用
        if userAccount == nil {
            // 内存中没有账户, 到沙盒加载一个账户(有可能加载出来也有可能加载不出来),赋值给内存中的账户
            userAccount = NSKeyedUnarchiver.unarchiveObjectWithFile(plistPath)as?CZUserAccount
            print("从沙盒加载账户:\(userAccount)")
        }else {
            print("直接从内存中获得账户")
        }
        //2.再判断(上面被赋值的userAccount)内存中是否有账户，有账户，判断时间是否过期
        if userAccount != nil && userAccount?.expiresDate?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
            //有账户且没过期,是一个可用账户
            return userAccount
        }
        return nil
    }
    
//        //解档 如果有对象需要判断是否过期
//       if let account =  NSKeyedUnarchiver.unarchiveObjectWithFile(plistPath) as? CZUserAccount {
//            //能到这里说明解档了一个对象，判断是否过期 如果过期返回nil
//            //account?.expiresDate和当前时间比较
//        /*
//        compare 返回值是 NSComparisonResult 类型
//        OrderedAscending: 升序, 左边的比右边的小  <
//        OrderedSame:    相等, 左边等于右边   =
//        OrderedDescending: 降序,左边的比右边的大  >
//        */
//
//            //compare 返回值是NSCompareisonResult 类型
//        
//        //测试过期时间
////        account.expiresDate = NSDate(timeIntervalSinceNow: -100)
//        print("account.expiresDate:\(account.expiresDate)")
//        print("NSDate( ):\(NSDate())")
//           if account.expiresDate?.compare(NSDate( )) == NSComparisonResult.OrderedDescending {
//                print("没有过期")
//                return account
//            }
//            
//        }
//        return nil
//    }
    
    
    //解档
    required init?(coder aDecoder: NSCoder) {
       access_token =  aDecoder.decodeObjectForKey("access_token") as? String
       expires_in =  aDecoder.decodeDoubleForKey("expires_in")
      expiresDate = aDecoder.decodeObjectForKey("expiresDate") as? NSDate
       uid = aDecoder.decodeObjectForKey("uid") as? String
    }
    //归档
    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(access_token, forKey: "access_token")
        aCoder.encodeDouble(expires_in, forKey: "expires_in")
        aCoder.encodeObject(expiresDate, forKey: "expiresDate")
        aCoder.encodeObject(uid, forKey: "uid")
    }
    
    ///当KVC字典的key在模型中找不到对应的属性
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
//        print("forUndefinedKey: \(key)")
        }
    
    //打印对象信息
   override var description: String {
    return  "access_token: \(access_token),expires_in: \(expires_in),uid: \(uid),expiresDate:\(expiresDate)"
    }
    
//    init(dict: [String: AnyObject] ) {
//        access_token = dict["access_token"]  as! String
//        expires_in = dict["expires_in"] as! String
//        uid = dict["uid"] as! String
//        super.init( )
//    }
    
}
